.TH std::promise::set_value_at_thread_exit 3 "2024.06.10" "http://cppreference.com" "C++ Standard Libary"
.SH NAME
std::promise::set_value_at_thread_exit \- std::promise::set_value_at_thread_exit

.SH Synopsis
   Main template
   void set_value_at_thread_exit( const R& value ); \fB(1)\fP \fI(since C++11)\fP
   void set_value_at_thread_exit( R&& value );      \fB(2)\fP \fI(since C++11)\fP
   std::promise<R&> specializations
   void set_value_at_thread_exit( R& value );       \fB(3)\fP \fI(since C++11)\fP
   std::promise<void> specialization
   void set_value_at_thread_exit();                 \fB(4)\fP \fI(since C++11)\fP

   Stores the value into the shared state without making the state ready immediately.
   The state is made ready when the current thread exits, after all variables with
   thread-local storage duration have been destroyed.

   The operation behaves as though set_value, set_exception, set_value_at_thread_exit,
   and set_exception_at_thread_exit acquire a single mutex associated with the promise
   object while updating the promise object.

   Calls to this function do not introduce data races with calls to get_future
   (therefore they need not synchronize with each other).

.SH Parameters

   value - value to store in the shared state

.SH Return value

   \fI(none)\fP

.SH Exceptions

   std::future_error on the following conditions:

     * *this has no shared state. The error code is set to no_state.
     * The shared state already stores a value or exception. The error code is set to
       promise_already_satisfied.

   Additionally:

   1) Any exception thrown by the constructor selected to copy an object of type R.
   2) Any exception thrown by the constructor selected to move an object of type R.

.SH Example


// Run this code

 #include <future>
 #include <iostream>
 #include <thread>

 int main()
 {
     using namespace std::chrono_literals;
     std::promise<int> p;
     std::future<int> f = p.get_future();
     std::thread([&p]
     {
         std::this_thread::sleep_for(1s);
         p.set_value_at_thread_exit(9);
     }).detach();

     std::cout << "Waiting... " << std::flush;
     f.wait();
     std::cout << "Done!\\nResult is: " << f.get() << '\\n';
 }

.SH Output:

 Waiting... Done!
 Result is: 9

   Defect reports

   The following behavior-changing defect reports were applied retroactively to
   previously published C++ standards.

      DR    Applied to              Behavior as published              Correct behavior
   LWG 2098 C++11      it was unclear which exceptions are required to made clear
                       be thrown

.SH See also

   set_value                    sets the result to specific value
                                \fI(public member function)\fP
                                sets the result to indicate an exception while
   set_exception_at_thread_exit delivering the notification only at thread exit
                                \fI(public member function)\fP
